package org.javahispano.javacup.modelo;

import org.newdawn.slick.Color;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;

/**Esta clase se encarga de dibujar el campo de juego, los arcos y el entorno*/
public class PintaCancha {

	private Image pasto,  arcilla,  arcoSup,  arcoInf,  image,  estadio,  cancha,  entorno;
	private int wm,  hm;
	private final Color c1 = new Color(1f, 1f, 1f, .75f);
	private final Color c2 = new Color(.3f, .6f, .31f, .4f);
	private Posicion esqSupEntorno = new Posicion(-450, -479);
	private Posicion esqSupEstadio = new Posicion(-166, -169);
	private Posicion esqSupCancha = Constantes.esqSupIzqCampoJuego.moverPosicion(-8.4, -10);

	public PintaCancha(int wm, int hm) throws SlickException {
		this.wm = wm;
		this.hm = hm;
		entorno = new Image("imagenes/noucamp/noucamp_entorno.jpg");
		estadio = new Image("imagenes/noucamp/noucamp_estadio.png");
		cancha = new Image("imagenes/cancha.png", Color.black);
		pasto = new Image("imagenes/pasto.png");
		arcilla = new Image("imagenes/arcilla.png");
		arcoSup = new Image("imagenes/arco_inferior.png");
		arcoInf = new Image("imagenes/arco_superior.png");
	}

	public void pintaEstadio(Graphics g, Posicion p, double escala) throws SlickException {
		int inf[] = Transforma.transform(esqSupEstadio, p, wm, hm, escala);
		float factor = (float) (escala * Constantes.LARGO_ARCO / 145);
		g.drawImage(estadio.getScaledCopy(factor * 6.66666f), inf[0], inf[1]);
	}

	public void pintaEntorno(Graphics g, Posicion p, double escala) throws SlickException {
		int inf[] = Transforma.transform(esqSupEntorno, p, wm, hm, escala);
		float factor = (float) (escala * Constantes.LARGO_ARCO / 145);
		g.drawImage(entorno.getScaledCopy(factor * 18.8f), inf[0], inf[1]);
	}

	public void pintaCancha(Graphics g, Posicion p, double escala) {
		int inf[] = Transforma.transform(esqSupCancha, p, wm, hm, escala);
		float factor = (float) (escala / 15d);
		g.drawImage(cancha.getScaledCopy(factor), inf[0], inf[1]);
	}

	public void pintaArcos(Graphics g, Posicion p, double escala) {
		int inf[] = Transforma.transform(Constantes.posteIzqArcoInf, p, wm, hm, escala);
		float factor = (float) (escala * Constantes.LARGO_ARCO / 145);
		double dy = 0.296552 * Constantes.LARGO_ARCO;
		g.drawImage(arcoInf.getScaledCopy(factor), inf[0], inf[1] - Transforma.transform(dy, escala));
		inf = Transforma.transform(Constantes.posteIzqArcoSup, p, wm, hm, escala);
		g.drawImage(arcoSup.getScaledCopy(factor), inf[0], inf[1]);
	}

	public void dibujaCancha(Graphics g, Posicion p, double escala) {

		int[] inf = Transforma.transform(Constantes.esqSupIzqCampo, p, wm, hm, escala);
		int[] dim = Transforma.transform(Constantes.dimCampo, escala);
		int[] cen = Transforma.transform(Constantes.centroCampoJuego, p, wm, hm, escala);
		int larg;
		int sx = dim[0] / 200 + 1;
		int sy = dim[1] / 200 + 1;

		for (int x0 = -sx; x0 < sx; x0++) {
			for (int y0 = -sy; y0 < sy; y0++) {
				g.drawImage(pasto, x0 * 100 + cen[0], y0 * 100 + cen[1]);
			}
		}
		for (int x0 = -sx; x0 < sx; x0++) {
			g.drawImage(arcilla, x0 * 100 + cen[0], inf[1] - 100);
			g.drawImage(arcilla, x0 * 100 + cen[0], inf[1] + dim[1]);
		}
		for (int y0 = -sy - 1; y0 < sy + 1; y0++) {
			g.drawImage(arcilla, inf[0] - 100, y0 * 100 + cen[1]);
			g.drawImage(arcilla, inf[0] + dim[0], y0 * 100 + cen[1]);
		}
		g.setColor(c2);
		g.setLineWidth(6);
		g.drawRect(inf[0], inf[1], dim[0], dim[1]);
		g.setColor(c1);
		g.setLineWidth(2);
		inf = Transforma.transform(Constantes.esqSupIzqCampoJuego, p, wm, hm, escala);
		dim = Transforma.transform(Constantes.dimCampoJuego, escala);
		g.drawRect(inf[0], inf[1], dim[0], dim[1]);
		g.drawLine(inf[0] + 1, cen[1], inf[0] + dim[0] - 2, cen[1]);
		inf = Transforma.transform(Constantes.esqSupIzqCircCentral, p, wm, hm, escala);
		larg = Transforma.transform(Constantes.RADIO_CIRCULO_CENTRAL * 2, escala);
		g.drawOval(inf[0], inf[1], larg, larg);
		inf = Transforma.transform(Constantes.esqSupIzqAreaGrandeSup, p, wm, hm, escala);
		dim = Transforma.transform(Constantes.dimAreaGrande, escala);
		g.drawRect(inf[0], inf[1], dim[0], dim[1]);
		inf = Transforma.transform(Constantes.esqSupIzqAreaGrandeInf, p, wm, hm, escala);
		g.drawRect(inf[0], inf[1], dim[0], dim[1]);
		inf = Transforma.transform(Constantes.esqSupIzqAreaChicaSup, p, wm, hm, escala);
		dim = Transforma.transform(Constantes.dimAreaChica, escala);
		g.drawRect(inf[0], inf[1], dim[0], dim[1]);
		inf = Transforma.transform(Constantes.esqSupIzqAreaChicaInf, p, wm, hm, escala);
		g.drawRect(inf[0], inf[1], dim[0], dim[1]);
		inf = Transforma.transform(Constantes.esqSupIzqPenalSup, p, wm, hm, escala);
		larg = Transforma.transform(Constantes.RADIO_PENAL * 2, escala);
		g.drawArc(inf[0], inf[1], larg, larg, 36, 144);
		inf = Transforma.transform(Constantes.esqSupDerPenalInf, p, wm, hm, escala);
		g.drawArc(inf[0], inf[1], larg, larg, 216, 324);
		inf = Transforma.transform(Constantes.centroCampoJuego, p, wm, hm, escala);
		g.fillOval(inf[0] - 2, inf[1] - 1, 4, 4);
		inf = Transforma.transform(Constantes.penalInf, p, wm, hm, escala);
		g.fillOval(inf[0] - 2, inf[1] - 2, 4, 4);
		inf = Transforma.transform(Constantes.penalSup, p, wm, hm, escala);
		g.fillOval(inf[0] - 2, inf[1] - 2, 4, 4);
	}
}
